package com.maomiao.gaode.util.json;


import android.util.Log;


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.JSONObject;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.commons.beanutils.BeanMap;
/**
* 解析 JSON 工具类，处理 JSONException。 <br>
* 
* 使用 fastjson 库。
* 
* @since App Version 4.0
* @author ly
*/
public final class ParseUtil {

	private static final String TAG	= "ly.util.ParseUtil";
	/**
	 * 将对象装换为map
	 * @param bean
	 * @return
	 */
	public static <T> Map<String, Object> beanToMap(T bean) {


		Map<String, Object> map = new HashMap();
		if (bean != null) {
			BeanMap beanMap = new BeanMap(bean);
			for (Object key : beanMap.keySet()) {
				map.put(key+"ssssss", beanMap.get(key));
			}
		}
		return map;
	}

	public static Map<String, Object> convertObjToMap(Object obj){
		Map<String,Object> reMap = new HashMap<String,Object>();
		if (obj == null){
			return null;
		}

		try {
			Class<?> objClass = obj.getClass();
			while(objClass != null){
				Field[] fields = objClass.getDeclaredFields();
				for(int i=0;i<fields.length;i++){
					try {
						Field f = objClass.getDeclaredField(fields[i].getName());
						f.setAccessible(true);
						Object o = f.get(obj);


						if (o!=null&&!"shadow$_klass_".equals(fields[i].getName())&&!"shadow$_monitor_".equals(fields[i].getName())){
							reMap.put(fields[i].getName(), ""+o);
						}

					} catch (NoSuchFieldException e) {
						e.printStackTrace();
					} catch (IllegalArgumentException e) {
						e.printStackTrace();
					} catch (IllegalAccessException e) {
						e.printStackTrace();
					}
				}
				objClass = objClass.getSuperclass();
			}
		} catch (SecurityException e) {
			e.printStackTrace();
		}
		return reMap;
	}

	/**
	 * JSONObject 数据实例化。
	 * 
	 * @Title parseObject
	 * @Description JSONObject 数据实例化。
	 * 
	 * @param text
	 * @param clazz
	 * @return
	 */
	public static <T> T parseObject(String text, Class<T> clazz) {
		if (text != null && text.length() > 0) {
			try {
				return JSON.parseObject(text, clazz);
			}
			catch (Exception e) {
				e.printStackTrace();
				//Log.e(TAG, "parseObject exception, string text: " + text+"\n"+e.getMessage());
				Log.e(TAG, "parseObject exception, string text: " +"\n"+e.getMessage());
			}
		}
		try {
			return clazz.newInstance();
		}
		catch (Exception e) {
			Log.e(TAG, "parseObject exception, string text: " +"\n"+e.getMessage());
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * JSONArray 数据实例化。
	 * 
	 * @Title parseArray
	 * @Description JSONArray 数据实例化。
	 * 
	 * @param text
	 * @param clazz
	 * @return
	 */
	public static <T> List<T> parseArray(String text, Class<T> clazz) {

		if (text != null && text.length() > 0) {
			try {
				return JSON.parseArray(text, clazz);
			}
			catch (Exception e) {
				Log.e(TAG, "parseObject exception, string text: " + e);
			}
		}
		return new ArrayList<T>();
	}

	/**
	 * 解析 {@link JSONObject}。
	 * 
	 * @Title parseJSONObject
	 * @Description 解析 {@link JSONObject}。
	 * 
	 * @param text
	 * @return 若异常则返回空 {@link JSONObject}
	 */
	public static JSONObject parseJSONObject(String text) {
		if (text != null && text.length() > 0) {
			try {
				JSONObject object = JSON.parseObject(text);
				if (object != null) {
					return object;
				}
			}
			catch (Exception e) {
				Log.e(TAG, "parseJSONObject exception, string text: " + text);
			}
		}
		return new JSONObject();
	}
	public static JSONObject parseJSONObject2(String text) throws Exception {
		if (text != null && text.length() > 0) {

				JSONObject object = JSON.parseObject(text);
				if (object != null) {
					return object;
				}


		}
		return new JSONObject();
	}

	/**
	 * 从 {@link JSONObject} 中解析 {@link JSONObject}。
	 * 
	 * @Title parseJSONObject
	 * @Description 从 {@link JSONObject} 中解析 {@link JSONObject}。
	 * 
	 * @param object
	 * @param key
	 * @return 若异常则返回 null
	 */
	public static JSONObject parseJSONObject(JSONObject object, String key) {
		if (object != null && object.containsKey(key)) {
			try {
				return object.getJSONObject(key);
			}
			catch (JSONException e) {
				Log.e(TAG, "parseJSONObject exception, key: " + key + "\n--> JSONObject: ");

			}
		}
		return null;
	}

	/**
	 * 从 {@link JSONArray} 中解析 {@link JSONObject}。
	 * 
	 * @Title parseJSONObject
	 * @Description 从 {@link JSONArray} 中解析 {@link JSONObject}。
	 * 
	 * @param array
	 * @param index
	 * @return 若异常则返回 null
	 */
	public static JSONObject parseJSONObject(JSONArray array, int index) {
		if (array != null) {
			try {
				return array.getJSONObject(index);
			}
			catch (JSONException e) {
				Log.e(TAG, "parseJSONObject exception, index: " + index + "\n--> JSONArray: ");
				Log.e(TAG, array.toString());
			}
		}
		return null;
	}

	/**
	 * 从 {@link JSONObject} 中解析 {@link JSONArray}。
	 * 
	 * @Title parseJSONArray
	 * @Description 从 {@link JSONObject} 中解析 {@link JSONArray}。
	 * 
	 * @param object
	 * @param key
	 * @return 若异常则返回空 {@link JSONArray}
	 */
	public static JSONArray parseJSONArray(JSONObject object, String key) {
		if (object != null) {
			try {
				return object.getJSONArray(key);
			}
			catch (JSONException e) {
				Log.e(TAG, "parseJSONArray exception, key: " + key + "\n--> JSONObject: ");

			}
		}
		return new JSONArray();
	}

	/**
	 * 从 {@link JSONObject} 中解析 {@link String}。
	 * 
	 * @Title parseString
	 * @Description 从 {@link JSONObject} 中解析 {@link String}。
	 * 
	 * @param object
	 * @param key
	 * @return 若异常则返回 ""
	 */
	public static String parseString(JSONObject object, String key) {
		if (object != null && object.containsKey(key)) {
			try {
				String value = object.getString(key);
				return (value == null) ? "" : value.trim();
			}
			catch (JSONException e) {
				Log.e(TAG, "parseString exception, key: " + key + "\n--> JSONObject: ");

			}
		}
		return "";
	}

	/**
	 * 从 {@link JSONArray} 中解析 {@link String}。
	 * 
	 * @Title parseString
	 * @Description 从 {@link JSONArray} 中解析 {@link String}。
	 * 
	 * @param array
	 * @param index
	 * @return 若异常则返回 ""
	 */
	public static String parseString(JSONArray array, int index) {
		if (array != null) {
			try {
				return array.getString(index);
			}
			catch (JSONException e) {
				Log.e(TAG, "parseString exception, index: " + index + "\n--> JSONArray: ");

			}
		}
		return "";
	}

	/**
	 * 从 {@link JSONObject} 中解析 int。
	 * 
	 * @Title parseInt
	 * @Description 从 {@link JSONObject} 中解析 int。
	 * 
	 * @param object
	 * @param key
	 * @return 若异常则返回 0
	 */
	public static int parseInt(JSONObject object, String key) {
		String str = parseString(object, key);
		return NumberUtil.parseInt(str);
	}

	/**
	 * 从 {@link JSONObject} 中解析 long。
	 * 
	 * @Title parseLong
	 * @Description 从 {@link JSONObject} 中解析 long。
	 * 
	 * @param object
	 * @param key
	 * @return 若异常则返回 0
	 */
	public static long parseLong(JSONObject object, String key) {
		String str = parseString(object, key);
		return NumberUtil.parseLong(str);
	}

	/**
	 * 从 {@link JSONObject} 中解析 double。
	 * 
	 * @Title parseDouble
	 * @Description 从 {@link JSONObject} 中解析 double。
	 * 
	 * @param object
	 * @param key
	 * @return 若异常则返回 0
	 */
	public static double parseDouble(JSONObject object, String key) {
		String str = parseString(object, key);
		return NumberUtil.parseDouble(str);
	}

	/**
	 * 从 {@link JSONObject} 中解析 boolean。
	 * 
	 * @Title parseBoolean
	 * @Description 从 {@link JSONObject} 中解析 boolean。
	 * 
	 * @param object
	 * @param key
	 * @return 若异常则返回 false
	 */
	public static boolean parseBoolean(JSONObject object, String key) {
		if (object != null && object.containsKey(key)) {
			try {
				boolean value = object.getBoolean(key);
				return value;
			}
			catch (JSONException e) {
				Log.e(TAG, "parseBoolean exception, key: " + key + "\n--> JSONObject: ");

			}
		}
		return false;
	}

	
	
	public static <T> String toJSONString(T t){
		String json = null;
		if(t == null){
			return null;
		}
		try {
			json = JSON.toJSONString(t);
		} catch (Exception e) {
			Log.e(TAG, "toJSONString exception, \n--> JSONObject: ");

		}
		return json;
	}
	
	public static <T> String toJSONString(List<T> t){
		String json = null;
		if(t == null){
			return null;
		}
		try {
			json = JSON.toJSONString(t);
		} catch (Exception e) {
			Log.e(TAG, "toJSONString exception, \n--> JSONObject: ");

		}
		return json;
	}

	public static String toJSONString(Map t){
		String json = null;
		if(t == null){
			return null;
		}
		try {
			json = JSON.toJSONString(t);
		} catch (Exception e) {
			Log.e(TAG, "toJSONString exception, \n--> JSONObject: ");
		}
		return json;
	}



	public static Object toJSONObject(Set t){
		Object json = null;
		if(t == null){
			return null;
		}
		try {
			json = JSON.toJSONString(t);
		} catch (Exception e) {
			Log.e(TAG, "toJSONString exception, \n--> JSONObject: ");

		}
		return json;
	}

}
